﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using NUnit.Framework;
using Helpers;
using Capa_Dominio;
using Capa_Persistencia_NH;
using Capa_Persistencia_NH.Interface;
using Capa_Persistencia_NH.AccesoDatos;


namespace Capa_TestingProyects
{
    [TestFixture]
    public class Test_Reservacion
    {
        private IReservacion adminReservacion = null;
        int codigoGenerado = 0;
        SalaEnsayo objSalaEnsayo;
        Cliente objCliente;

        [TestFixtureSetUp]
        public void PrepararPruebas()
        {
            Local objLocal;
            TipoDocumento objTipoDocumento;
            Distrito objDistrito;

            LocalDAO daoLocal;
            SalaEnsayoDAO daoSalaEnsayo;
            TipoDocumentoDAO daoTipoDocumento;
            DistritoDAO daoDistrito;
            ClienteDAO daoCliente;

            daoLocal = new LocalDAO();
            daoSalaEnsayo = new SalaEnsayoDAO();
            daoTipoDocumento = new TipoDocumentoDAO();
            daoDistrito = new DistritoDAO();
            daoCliente = new ClienteDAO();

            adminReservacion = new ReservacionDAO();

            //foreach (Reservacion reserva in adminReservacion.ListarTodos())
            //    adminReservacion.Eliminar(reserva);
            // 4. Creamos 2 reservas para tenerlos disponibles en las pruebas
            //adminReservacion.Crear(new Reservacion() { CodigoSala =1, CodigoCliente =1, FechaReservacion = DateTime.Now, TotalHoras = 20, Observacion="Reserva para el sabado a las 3pm.", Estado=true });

            objLocal = daoLocal.Obtener(1);
            objTipoDocumento = daoTipoDocumento.Obtener(1);
            objDistrito = daoDistrito.Obtener(1);

            objSalaEnsayo = daoSalaEnsayo.Crear(new SalaEnsayo() { NombreSala = "Sala 1", Local = objLocal, Capacidad = 3, Caracteristicas = "Comentarios", Comentarios = "Ninguno", Disponibilidad = true, Estado = true });

            objCliente = daoCliente.Crear(new Cliente() { Apellidos = "Rojas Quispe", Nombres = "Angela", TipoDocumento = objTipoDocumento, NumeroDocumento = "40567980", Email = "rojasquispe@hotmail.com", ClaveAcceso = "nada", Direccion = "Casa", FechaNacimiento = new DateTime(1980, 5, 23, 0, 0, 0), Distrito = objDistrito, Estado = true });
        }

        [Test]
        public void Test1_Crear()
        {
            Assert.IsNotNull(adminReservacion);
            //se instancia a la entidad a crear
            Reservacion objReservacion = new Reservacion();

            objReservacion.SalaEnsayo = objSalaEnsayo;
            objReservacion.Cliente = objCliente;
            objReservacion.FechaReservacion = DateTime.Now;

            objReservacion.TotalHoras = 20;
            objReservacion.Observacion = "Reserva para el Domingo en la tarde";
            objReservacion.Estado = true;

            //se declara la entidad que se retornara
            Reservacion reservaRetornado = null;
            //no aseguramos que no retorne una exepcion
            Assert.DoesNotThrow(delegate
            {
                reservaRetornado = adminReservacion.Crear(objReservacion);
                codigoGenerado = reservaRetornado.CodigoReservacion;
            },"Reserva Generado");
            // Probamos que la entidad resultante no sea nula
            Assert.IsNotNull(reservaRetornado);
            //verificamos que el codigo generado sera mayor que 0
            Assert.Greater(codigoGenerado, 0);
        }


        [Test]
        public void Test2_Modificar()
        {
            // 1. Clase a probar: ReservacionDAO
            Assert.IsNotNull(adminReservacion);
            // 2. Declaramos e instanciamos la entidad de dominio
            Reservacion reservacionAModificar = adminReservacion.Obtener(codigoGenerado);
            reservacionAModificar.SalaEnsayo = objSalaEnsayo;
            reservacionAModificar.Cliente = objCliente;
            reservacionAModificar.FechaReservacion = DateTime.Now;
            reservacionAModificar.TotalHoras = 19;
            reservacionAModificar.Observacion = "Reserva para el Lunes en la noche";
            reservacionAModificar.Estado = true;
            // 3. Declaramos la entidad que contendrá el resultado
            Reservacion reservaModificado = null;
            // 4. Probamos que no ocurra error al ejecutar el método
            Assert.DoesNotThrow(delegate
            {
                // 5. Ejecutamos el método a probar
                reservaModificado = adminReservacion.Modificar(reservacionAModificar);
            }, "reserva modificado");
            // Probamos que la entidad resultante no sea nula
            Assert.IsNotNull(reservaModificado);
            // Probamos que el código generado sea mayor a 0
            Assert.AreEqual(reservaModificado.CodigoReservacion, codigoGenerado);
            // Probamos que la observacion registrado es igual al solicitado con la entidad
            Assert.AreEqual(reservaModificado.Observacion, reservacionAModificar.Observacion);
            // Probamos que el total de horas registrada es igual a la solicitada con la entidad
            Assert.AreEqual(reservaModificado.TotalHoras, reservacionAModificar.TotalHoras);
        }


        [Test]
        public void Test3_Eliminar()
        {
            // 1. Clase a probar: ReservacionDAO
            Assert.IsNotNull(adminReservacion);
            // 2. Definimos la entidad que contendrá el resultado
            Reservacion reservaExistente = adminReservacion.Obtener(codigoGenerado);
            // 3. Probamos que no ocurra error al ejecutar el método
            Assert.DoesNotThrow(delegate
            {
                // 5. Ejecutamos el método a probar
                adminReservacion.Eliminar(reservaExistente);
            });
            // Probamos que la entidad ya no existe
            Assert.IsNull(adminReservacion.Obtener(codigoGenerado));
        }


        [Test]
        public void Test5_ListarXNombre()
        {
            // 1. Clase a probar: ReservacionDAO
            Assert.IsNotNull(adminReservacion);
            string observacionReservacion = "reservaciones";
            // Declaramos la entidad que contendrá el resultado
            ICollection<Reservacion> reservacionEncontrados = null;
            //  Probamos que no ocurra error al ejecutar el método
            Assert.DoesNotThrow(delegate
            {
                //  Ejecutamos el método a probar
                reservacionEncontrados = adminReservacion.ListarXNombre(observacionReservacion);
            });
            // Probamos que la entidad resultante no sea nula
            Assert.IsNotNull(reservacionEncontrados);
            // Probamos que la cantidad de reservaciones encontrados sea igual o mayor que 1
            Assert.GreaterOrEqual(reservacionEncontrados.Count, 1);
            // Probamos que cada reserva contenga la cadena de búsqueda
            foreach (Reservacion reservacionEncontrado in reservacionEncontrados)
            {
                Assert.IsTrue(reservacionEncontrado.Observacion.Contains(observacionReservacion));
            }
        }


        [TestFixtureTearDown]
        public void TerminarPruebas()
        {
            NHibernateHelper.CerrarFabrica();
        }
    }
}
